package com.ceair.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ceair.entity.SysDictType;
import com.ceair.entity.request.dictionary.DictTypeInOrUpReq;
import com.ceair.entity.request.dictionary.QueryDictTypeReq;
import com.ceair.entity.vo.dictionary.SysDictTypeVO;
import com.ceair.enums.ResultCode;
import com.ceair.exception.BusinessException;
import com.ceair.mapper.SysDictTypeMapper;
import com.ceair.service.ISysDictTypeService;
import com.ceair.utils.SysDictTypeStructMapper;
import org.springframework.stereotype.Service;

import java.util.Objects;
import java.util.Optional;

/**
 * <p>
 * 字典类型表 服务实现类
 * </p>
 *
 * @author wangbaohai
 * @since 2025-03-27
 */
@Service
public class SysDictTypeServiceImpl extends ServiceImpl<SysDictTypeMapper, SysDictType> implements ISysDictTypeService {

    /**
     * 分页查询字典类型信息。
     *
     * @param queryDictTypeReq 查询条件请求对象，包含分页信息和查询参数。
     *                         - pageReq: 分页请求对象，包含当前页码和每页大小。
     * @return 返回分页结果对象 Page<SysDictType>，包含符合条件的字典类型数据以及分页信息。
     */
    @Override
    public Page<SysDictType> queryDictTypeWithPage(QueryDictTypeReq queryDictTypeReq) {
        // 初始化分页工具以及参数，设置当前页码和每页大小
        Page<SysDictType> page = new Page<>(queryDictTypeReq.getPageReq().getCurrent(),
                queryDictTypeReq.getPageReq().getSize());

        // 调用mapper进行分页查询，返回查询结果
        return this.baseMapper.queryDictTypeWithPage(page, queryDictTypeReq);
    }

    /**
     * 保存或更新字典类型信息。
     *
     * @param dictTypeInOrUpReq 包含字典类型信息的请求对象，可能包含部分字段为空。
     *                          该对象中的非空字段将用于更新或创建字典类型。
     * @return 返回保存或更新后的字典类型视图对象（SysDictTypeVO），便于前端展示或后续操作。
     */
    @Override
    public SysDictTypeVO save(DictTypeInOrUpReq dictTypeInOrUpReq) {
        // 初始化 SysDictType 对象，用于存储字典类型信息
        SysDictType sysDictType = new SysDictType();

        // 校验 唯一键 dictType
        if (Objects.isNull(dictTypeInOrUpReq.getId())
                && Optional.ofNullable(lambdaQuery().eq(SysDictType::getDictType,
                dictTypeInOrUpReq.getDictType()).one()).isPresent()) {
            throw new BusinessException(ResultCode.FAILED.getCode(), "字典类型：" + dictTypeInOrUpReq.getDictType() +
                    "已存在");
        }

        // 将请求对象中的非空字段复制到 SysDictType 对象中，避免空值覆盖已有数据
        BeanUtil.copyProperties(dictTypeInOrUpReq, sysDictType, CopyOptions.create().ignoreNullValue());

        // 调用 saveOrUpdate 方法，根据主键判断是执行更新还是插入操作
        saveOrUpdate(sysDictType);

        // 将保存或更新后的 SysDictType 对象转换为视图对象（VO）并返回
        return SysDictTypeStructMapper.INSTANCE.toVO(sysDictType);
    }


}
